#include "mycanvas.h"
MyCanvas::MyCanvas(QWidget *parent, QTableWidget* items) :
    QWidget(parent)
{
    puntos=new QList<Punto>();
    this->items=items;
    this->pintar=false;
    this->r=new Random(0,100);
}

MyCanvas::~MyCanvas()
{
    delete puntos;
    delete r;
}

void MyCanvas::paintEvent(QPaintEvent* pEvent)
{
    Lista lista;
    QPainter painter(this);
    QSize size = this->size();
    painter.fillRect(0,0,size.width(), size.height(), Qt::black);
    painter.setPen(Qt::red);
    Punto actual(0, 0);
    lista.append(actual);
    //painter.drawPoint(actual);
    if(pintar)
    {
        for(int i=0;i<cantpuntos;i++)
        {
            actual=puntosig(actual);
            //painter.drawPoint(actual);
            lista.append(actual);
        }
        this->x_cotainferior=lista.minimoX;
        this->x_cotasuperior=lista.maximoX;
        this->y_cotainferior=lista.minimoY;
        this->y_cotasuperior=lista.maximoY;
        for(int i=0;i<cantpuntos;i++)
        {
            int xcanvas=x_canvas(lista.elementos->at(i).coorx, &this->size());
            //int xcanvas=this->size().width()*(lista.elementos->at(i).coorx-lista.minimoX)/(lista.maximoX-lista.minimoX);
            int ycanvas=y_canvas(lista.elementos->at(i).coory, &this->size());
            //int ycanvas=this->size().height()*(1-(lista.elementos->at(i).coory-lista.minimoY)/(lista.maximoY-lista.minimoY));
            painter.drawPoint(xcanvas, ycanvas);
        }
    }
}


Punto MyCanvas::puntosig(Punto puntoanterior)
{
    int numMatriz=matrizSig();
    QGenericMatrix<1,2, double> punto;
    punto.data()[0]=puntoanterior.x();
    punto.data()[1]=puntoanterior.y();
    QGenericMatrix<2,2, double> matriz;
    matriz.data()[0]=this->items->item(numMatriz, 0)->text().toDouble();
    matriz.data()[1]=this->items->item(numMatriz, 2)->text().toDouble();
    matriz.data()[2]=this->items->item(numMatriz, 1)->text().toDouble();
    matriz.data()[3]=this->items->item(numMatriz, 3)->text().toDouble();
    QGenericMatrix<1,2, double> desplazamiento;
    desplazamiento.data()[0]=this->items->item(numMatriz, 4)->text().toDouble();
    desplazamiento.data()[1]=this->items->item(numMatriz, 5)->text().toDouble();
    QGenericMatrix<1,2, double> sigpunto=matriz*punto+desplazamiento;
    return Punto(sigpunto.data()[0], sigpunto.data()[1]);
}

int MyCanvas::matrizSig()
{
    int aleatorio=int(r->Next());
    int cantMatrices=this->items->rowCount()-1;
    double probabilidad=this->items->item(1,6)->text().toDouble();
    int cotainferior=0;
    for(int i=2;i<=cantMatrices+1;i++)
    {
        probabilidad=this->items->item(i-1,6)->text().toDouble();
        if(aleatorio<100*probabilidad+cotainferior)
            return i-1;
        cotainferior=100*probabilidad+cotainferior;
    }
    return 0;
}

int MyCanvas::x_canvas(double coordenada, QSize* size)
{
    double nuevox=this->cambiarSistemaCoordenadas(coordenada, this->x_cotainferior, this->x_cotasuperior, 0, size->width());
    //return (int)nuevox+size->width()/2;
    return (int)nuevox;
}

int MyCanvas::y_canvas(double coordenada, QSize* size)
{
    double nuevoy=this->cambiarSistemaCoordenadas(coordenada, this->y_cotainferior, this->y_cotasuperior, size->height(), 0);
    //return (int)-nuevoy+size->height()/2;
    return (int)nuevoy;
}


double MyCanvas::x_funcion(int coordenada, QSize* size)
{
    //coordenada=coordenada-size->width()/2;
    double x=this->cambiarSistemaCoordenadas(coordenada,0, size->width(), this->x_cotainferior, this->x_cotasuperior);
    return x;
}

double MyCanvas::y_funcion(int coordenada, QSize* size)
{
    //coordenada=-coordenada+size->height()/2;
    double y=this->cambiarSistemaCoordenadas(coordenada,size->height(), 0, this->y_cotainferior, this->y_cotasuperior);
    return y;
}

double MyCanvas::cambiarSistemaCoordenadas(double coordenada, double cotainferiorvieja, double cotasuperiorvieja, double cotainferiornueva, double cotasuperiornueva)
{
    double a=cotainferiorvieja;
    double b=cotasuperiorvieja;
    double ap=cotainferiornueva;
    double bp=cotasuperiornueva;
    double resultado=ap+(coordenada-a)*(bp-ap)/(b-a);
    return resultado;

}
